视频
- 文本识别 OCR 神器 MMOCR【OpenMMLab】_哔哩哔哩_bilibili
- TommyZihao/MMOCR_tutorials: Jupyter notebook tutorials for MMOCR (github.com)
课程
1
文本识别 OCR 神器 MMOCR【OpenMMLab】
OpenMMLab 是一个开源人工智能算法体系,涵盖了多种领域的多种人工智能算法的开源实现。
open-mmlab/mmocr: OpenMMLab Text Detection, Recognition and Understanding Toolbox (github.com) 是 OpenMMLab 下的一个用于 OCR 领域的工具包。包含如下功能:
- 文本区域检测
- 文本内容识别
- 关键信息提取
课程所包含的代码实战教程。
课程中将基于 TextSnake 给文字区域打马赛克。
OCR 即光学字符识别,包含文本区域检测、文本内容识别和关键信息提取。
对于文本识别,又分为文档文本识别和场景文本识别。
文本图像可能存在噪音、复杂背景、多语种、倾斜、弯曲、多形状和多种字体等属性,是 OCR 的难点与挑战。
一般的 OCR 系统流程分为两种:
- 两部方法
- 文本区域检测-裁剪出文本区域-文本内容识别
- 端到端方法
- 一个统一网络同时完成文本检测和文本识别两个任务
学会 MMOCR 能做什么
清华本科特奖的一个项目。
关键信息提取是 OCR 的下游任务之一。
开源 OCR 算法库:MMOCR
上述下游任务的实现有些需要调用第三方 API,如果我们想使用自己的数据集进行训练、无限量地使用等,开源的 OCR 算法库是一个好的解决方案。
MMOCR 集成了若干顶会所提出的前沿算法。
各种算法的简介和使用方法可以在官方文档中找到。
MMOCR 所包含的文本区域检测算法:
- MaskRCNN
- PAN
- PSENet
- DB
- TextSnake
- DRRG
- FCENet
MMOCR 所包含的文本内容识别算法:
- CRNN
- Robust
- Scanner
- SAR
- SegOCR
- Transformer
- ABINet
- SATRN
MMOCR 包含的 OCR 下游任务——Text Understanding 文本内容理解算法:
- Key Information Extraction: SDMG-R 关键信息提取
- Named Entity Recognition: Bert-softmax 命名实体识别
MMOCR 依赖于 MMDetection 和 MMCV。
MMOCR 具有模块化设计。
MMOCR 所包含的功能:
- 数据集
- 常用 OCR 数据集及格式转换工具
- 训练
- 单机训练
- 多机训练
- 集群训练
- Slurm 调度器
- 测试
- 主流性能评估指标
- FLOPS 评估
- 速度评估
- 可视化
- 文本检测
- 文本识别
- 关键信息提取
- 部署(便于部署到实际应用中)
- 导出为 ONNX
- ONNX 转 TensorRT
文本区域检测算法的部署,在 OpenVino 中实时调用摄像头进行场景文本检测。
常用 OCR 数据集和算法评估指标
常用的文本检测和文本识别的数据集。
用于场景文本识别的数据集 MJSynth,合成图片背景相对简单。
- Scene Text Recognition using Higher Order Language Priors - Inria - Institut national de recherche en sciences et technologies du numérique (hal.science)
- [1812.05824] ESIR: End-to-end Scene Text Recognition via Iterative Image Rectification (arxiv.org)
- (PDF) ICDAR 2003 robust reading competitions (researchgate.net)
- ICDAR 2013 Dataset | Papers With Code
- ICDAR 2015 Dataset | Papers With Code
- SCUT-CTW1500 Dataset | Papers With Code
- SCUT-CTW1500 Dataset | Papers With Code
数据集由图像和标注两部分组成,对文本检测而言,它的标注范式与图像分割非常类似,都是用多段线去包络一个文字区域。
对于文本内容识别的任务,标注包含文件名和对应的文字内容。
置信度(confidence)
模型在检测过程中,一个目标上可能会出现多个框,每一个框会对应一个 confidence,confidence 阈值就是之后计算 TP,FP,TN,FN 等参数的界限;
交并比(IOU)
计算模型预测出的框和标签中标注的框的 IOU,IOU 用于判定目标是真目标还是假目标,大于 IOU 阈值的框会认定为 True,小于 IOU 阈值的检测框会认定为 False;
计算 TP,FP,TN,FN
- TP:大于 IOU 阈值且大于 confidence 阈值(实际是正样本,判定为正样本);(检测对了)
- FP:小于 IOU 阈值且大于 confidence 阈值(实际是负样本,判定为正样本);(检测错了)
- TN:小于 IOU 阈值且小于 confidence 阈值(实际是负样本,判定为负样本);(不用于计算)
- FN:大于 IOU 阈值且小于 confidence 阈值(实际是正样本,判定为负样本);(没检测出来)
-
文本检测
- 基于 IoU 计算(预测区域和标记区域的交并集)
- Precision: TP / (TP + FP) 查准率
- Recall: TP / (TP + FN) 查全率,TP + FN 为所有正样本的数量
- hmean:P 与 R 的调和平均数
- 基于 IoU 计算(预测区域和标记区域的交并集)
-
文本内容识别
- 基于混淆矩阵计算(本质上是一个分类问题)
- Accuracy
- Precision
- Recall
- 基于编辑距离/莱文斯坦距离(Levenshtein)计算
- 1-N.E.D
- 基于混淆矩阵计算(本质上是一个分类问题)
MMOCR 中集成了各种评估指标。
2
从 TommyZihao/MMOCR_tutorials: Jupyter notebook tutorials for MMOCR (github.com) 获取文件。
必须完成 A
才可以完成下面的内容!
A 安装配置 MMOCR
虚拟环境安装 jupyter notebook:在 conda 创建的虚拟环境中安装 jupyter 以及使用_conda 虚拟环境怎么连接 jupyter-CSDN 博客
安装 MMOCR:[Paper-MMOCR-A Comprehensive Toolbox for Text Detection, Recognition and Understanding | Zi-Zi’s Journey](/2024/05/30/Paper-MMOCR-A Comprehensive Toolbox for Text Detection, Recognition and Understanding/)
检查安装成功:
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
B1 预训练模型预测-文本识别
导入工具包:
1 |
|
载入模型,实例化 MMOCRInferencer,rec='svtr-small'
使用 SVTR 模型进行文本识别:mmocr/configs/textrecog/svtr at main · open-mmlab/mmocr (github.com)。
下载 https://download.openmmlab.com/mmocr/textrecog/svtr/svtr-small_20e_st_mj/svtr-small_20e_st_mj-35d800d6.pth 并放到合适位置,使用 rec_weights
设定模型位置(如果没有设定,则它会自动下载到一个地方)
1 |
|
1 |
|
载入预测图像,就决定是你了:
场景文本识别模型只支持裁剪出文本区域的小图的识别。
1 |
|
执行预测:
1 |
|
解析预测结果-文本内容及置信度
1 |
|
1 |
|
1 |
|
1 |
|
解析预测结果-可视化:
1 |
|
B2 预训练模型预测-文字区域检测
导入工具包:
1 |
|
载入模型,实例化 MMOCRInferencer,det='textsnake'
使用 Textsnake 模型进行文本识别:[文本检测模型 — MMOCR 1.0.1 文档](https://github.com/open-mmlab/mmocr/tree/main/configs/textrecog/svtr)。
下载 https://download.openmmlab.com/mmocr/textdet/textsnake/textsnake_resnet50-oclip_fpn-unet_1200e_ctw1500/textsnake_resnet50-oclip_fpn-unet_1200e_ctw1500_20221101_134814-a216e5b2.pth 并放到合适位置,使用 rec_weights
设定模型位置(如果没有设定,则它会自动下载到一个地方)
1 |
|
载入预测图像,就决定是你了:
1 |
|
执行预测:
1 |
|
解析预测结果-文字区域及置信度:
1 |
|
1 |
|
解析预测结果-文字区域可视化:
1 |
|
也可自行加载配置文件(Method)和对应的模型(Model):
从这里下载:文本检测模型 — MMOCR 1.0.1 文档
1 |
|
1 |
|
预测结果虽然是长方形,但是似乎是检测到了弯曲文本,长方形是经过处理后得到的:
像如下模型:
1 |
|
1 |
|
对于弯曲文本,则检测失败:
B3 预训练模型预测-端到端 OCR
相当于对一张图片先进行场景文本检测,再进行场景文本识别。
导入工具包:
1 |
|
载入场景文本检测模型:DBNet 以及场景文本识别模型:svtr-small:
1 |
|
载入预测图像,就决定是你了:
1 |
|
执行预测并获得结果:
1 |
|
1 |
|
1 |
|
得到了文本实例、文本范围以及相应的置信度。
可视化 OCR 结果(可以从 results/vis/
文件夹下看到):
直接本地保存!
1 |
|
B4 预训练模型预测-OCR 下游任务之 KIE
KIE 即 Key Information Extraction,旨在从图像(或文本)中提取出关键信息。这里 MMOCR 选用了一个 SDMGR 算法,用于发票信息提取。
一阵操作:
1 |
|
感觉这个算法就是将场景文本检测的结果出的框框再进行一个分类操作。
对自己的图片似乎也能识别出部分信息。
之后简单介绍了一下场景文本检测和场景文本识别的模型:
【C1】训练自己的文本识别模型
读取训练用的配置文件:
1 |
|
配置文件及解析:
这段 Python 代码主要用于配置文本检测模型的训练和测试管道,通常在深度学习框架(如 MMDetection 或类似项目)中使用。以下是对代码各部分的详细解释:
1 |
|
_base_
列表包含几个基础配置文件的路径,这些文件定义了模型结构、数据集、运行时设置和训练计划等。
1 |
|
-
train_pipeline
定义了一系列处理步骤,用于训练数据的预处理:-
加载图像:从文件中读取图像,并忽略方向。
-
加载 OCR 注释:加载与文本检测相关的信息(多边形、边界框和标签)。
-
修复无效多边形:确保多边形至少包含 4 个顶点。
-
颜色抖动:随机调整图像的亮度和饱和度,增强训练数据的多样性。
-
图像增强:包括随机翻转、旋转和缩放。
-
随机裁剪:根据最小边比进行随机裁剪。
-
调整大小:将图像调整为 640 x 640 的大小,保持比例。
-
填充:如果图像小于 640 x 640,则填充至该尺寸。
-
打包输入:将处理后的图像和元数据打包成模型输入格式。
-
1 |
|
-
test_pipeline
与train_pipeline
类似,但针对测试阶段进行了调整:-
图像被调整为 1333 x 736 的大小。
-
同样加载 OCR 注释并修复无效多边形。
-
1 |
|
- 从基础配置中获取训练和测试数据集,并为它们指定相应的处理管道。
1 |
|
-
train_dataloader
和val_dataloader
定义了训练和验证的数据加载器:-
batch_size:每个批次的样本数量(训练为 16,验证为 1)。
-
num_workers:用于数据加载的工作线程数。
-
pin_memory:是否将数据加载到固定内存中,以加快 GPU 训练。
-
persistent_workers:在数据加载过程中保持工作线程持续运行。
-
sampler:数据的采样方式(训练时打乱顺序,验证时不打乱)。
-
1 |
|
- 配置自动缩放学习率的选项,以便根据基础批次大小动态调整学习率。